package com.ruoyi.business.service.impl;

import java.util.HashMap;
import java.util.List;

import com.ruoyi.business.domain.JtProductCategory;
import com.ruoyi.business.domain.JtProductSn;
import com.ruoyi.business.domain.JtSupplier;
import com.ruoyi.business.service.IJtProductCategoryService;
import com.ruoyi.business.service.IJtProductSnService;
import com.ruoyi.business.service.IJtSupplierService;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.business.mapper.JtProductMapper;
import com.ruoyi.business.domain.JtProduct;
import com.ruoyi.business.service.IJtProductService;
import com.ruoyi.common.core.text.Convert;

/**
 * 产品信息Service业务层处理
 * 
 * @author Alan Zhang
 * @date 2025-05-22
 */
@Service
public class JtProductServiceImpl implements IJtProductService 
{
    @Autowired
    private JtProductMapper jtProductMapper;
    @Autowired
    private IJtProductSnService jtProductSnService;
    @Autowired
    private IJtSupplierService jtSupplierService;
    @Autowired
    private IJtProductCategoryService jtProductCategoryService;
    /**
     * 查询产品信息
     * 
     * @param productId 产品信息主键
     * @return 产品信息
     */
    @Override
    public JtProduct selectJtProductByProductId(Long productId)
    {
        return jtProductMapper.selectJtProductByProductId(productId);
    }

    /**
     * 查询产品信息
     *
     * @param productCode 产品编码
     * @return 产品信息
     */
    public JtProduct selectJtProductByProductCode(String productCode){
        return jtProductMapper.selectJtProductByProductCode(productCode);
    }

    /**
     * 查询产品信息列表
     * 
     * @param jtProduct 产品信息
     * @return 产品信息
     */
    @Override
    public List<JtProduct> selectJtProductList(JtProduct jtProduct)
    {
        return jtProductMapper.selectJtProductList(jtProduct);
    }

    /**
     * 新增产品信息
     * 
     * @param jtProduct 产品信息
     * @return 结果
     */
    @Override
    public int insertJtProduct(JtProduct jtProduct)
    {
        jtProduct.setCreateTime(DateUtils.getNowDate());
        return jtProductMapper.insertJtProduct(jtProduct);
    }

    /**
     * 修改产品信息
     * 
     * @param jtProduct 产品信息
     * @return 结果
     */
    @Override
    public int updateJtProduct(JtProduct jtProduct)
    {
        jtProduct.setUpdateTime(DateUtils.getNowDate());
        return jtProductMapper.updateJtProduct(jtProduct);
    }

    /**
     * 批量删除产品信息
     * 
     * @param productIds 需要删除的产品信息主键
     * @return 结果
     */
    @Override
    public int deleteJtProductByProductIds(String productIds)
    {
        return jtProductMapper.deleteJtProductByProductIds(Convert.toStrArray(productIds));
    }

    /**
     * 删除产品信息信息
     * 
     * @param productId 产品信息主键
     * @return 结果
     */
    @Override
    public int deleteJtProductByProductId(Long productId)
    {
        return jtProductMapper.deleteJtProductByProductId(productId);
    }


    private HashMap<String, Long> productCategoryToMap(){
        HashMap<String, Long> categoryMap = new HashMap<>();
        JtProductCategory param = new JtProductCategory();
        List<JtProductCategory> list = jtProductCategoryService.selectJtProductCategoryList(param);
        for(JtProductCategory item :list){
            if(!categoryMap.containsKey(item.getCategoryNameZh())){
                categoryMap.put(item.getCategoryNameZh(), item.getCategoryId());
            }
        }
        return categoryMap;
    }

    private HashMap<String, Long> supplierToMap(){
        HashMap<String, Long> supplierMap = new HashMap<>();
        JtSupplier jtSupplier = new JtSupplier();
        List<JtSupplier> list = jtSupplierService.selectJtSupplierList(jtSupplier);
        for(JtSupplier item :list){
            if(!supplierMap.containsKey(item.getSupplierName())){
                supplierMap.put(item.getSupplierName(), item.getSupplierId());
            }
        }
        return supplierMap;
    }

    /**
     * 导入商品信息
     * @param list  商品信息
     * @param optName  操作人
     * @param isUpdateSupport  是否支持更新
     * @return
     */
    @Override
    public String importProductInfo(List<JtProduct> list, String optName, boolean isUpdateSupport){
        if (StringUtils.isNull(list) || list.size() == 0) {
            throw new BaseException("未发现可导入的信息！");
        }
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        JtProduct param = new JtProduct();
        HashMap<String, Long> categoryMap = null;
        HashMap<String, Long> supplierMap = null;
        int i = 1;
        for (JtProduct entity : list) {
            i++;
            if(StringUtils.isEmpty(entity.getProductName())){
                failureNum++;
                failureMsg.append("<br/>").append(i).append("、未填写 商品名称！");
                continue;
            }
            if(StringUtils.isEmpty(entity.getProductCode())){
                failureNum++;
                failureMsg.append("<br/>").append(i).append("、未填写 产品编码！");
                continue;
            }
            if (entity.getCost() == null) {
                failureNum++;
                failureMsg.append("<br/>").append(i).append("、未填写 成本价！");
                continue;
            }

            if(entity.getAttributes() == null){
                failureNum++;
                failureMsg.append("<br/>").append(i).append("、未填写 商品属性！");
                continue;
            }

            if(StringUtils.isNotEmpty(entity.getCategoryName())){
                if(categoryMap == null) {
                    categoryMap = productCategoryToMap();
                }

                entity.setCategoryId(categoryMap.get(entity.getCategoryName()));
            }
            if(StringUtils.isNotEmpty(entity.getSupplierName())){
                if(supplierMap == null) {
                    supplierMap = supplierToMap();
                }

                entity.setSupplierId(supplierMap.get(entity.getSupplierName()));
            }

            param.setProductCode(null);
            param.setProductName(null);
            param.setStyleNo(null);
            //每天数据是否存在
            param.setProductCode(entity.getProductCode());
            param.setProductName(entity.getProductName());
            param.setStyleNo(entity.getStyleNo());

            List<JtProduct> productList = selectJtProductList(param);
            int rows = 0;
            if(productList.size() ==0){
                entity.setCreateBy(optName);
                rows = insertJtProduct(entity);
            } else {
                if(productList.size() == 1){
                    if(isUpdateSupport ) {
                        entity.setProductId(productList.get(0).getProductId());
                        entity.setUpdateBy(optName);
                        rows = updateJtProduct(entity);
                    } else {
                        failureNum++;
                        failureMsg.append("<br/>").append(i).append("、[").append(entity.getProductCode()).append("] 已存在，不支持更新！如需覆盖请勾选【覆盖】。");
                        continue;
                    }
                } else {
                    failureNum++;
                    failureMsg.append("<br/>").append(i).append("、[").append(entity.getProductCode()).append("] 查询到多条记录。");
                    continue;
                }
            }
            if(rows > 0) {
                successNum++;
                successMsg.append("<br/>").append(i).append("、").append(entity.getProductName()).append(" [").append(entity.getProductCode()).append("] 成功");
            } else {
                failureNum++;
                failureMsg.append("<br/>").append(i).append("、").append(entity.getProductName()).append("[").append(entity.getProductCode()).append("] 失败");
            }
        }
        if (failureNum > 0)
        {
            failureMsg.insert(0, "很抱歉，导入失败！共 " + failureNum + " 条数据格式不正确，错误如下：");
            throw new BaseException(failureMsg.toString());
        }
        else
        {
            successMsg.insert(0, "恭喜您，数据已全部导入成功！共 " + successNum + " 条，数据如下：");
        }
        return successMsg.toString();
    }

    /**
     * 导入 产品序列号
     * @param list
     * @param optName
     * @param isUpdateSupport
     * @return
     */
    public String importProductSn(List<JtProductSn> list,Long productId, String optName, boolean isUpdateSupport){
        if (StringUtils.isNull(list) || list.size() == 0) {
            throw new BaseException("未发现可导入的信息！");
        }

        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        JtProductSn param = new JtProductSn();

        int i = 1;
        for (JtProductSn entity : list) {
            i++;
            if(StringUtils.isEmpty(entity.getProductSn())){
                failureNum++;
                failureMsg.append("<br/>").append(i).append("、未填写 商品名称！");
                continue;
            }

            if(entity.getProductId() == null){
                entity.setProductId(productId);
            }

            if (entity.getProductId() == null) {
                failureNum++;
                failureMsg.append("<br/>").append(i).append("、未填写 产品ID必填！");
                continue;
            }


            List<JtProductSn> productSnList = jtProductSnService.selectJtProductSnList(entity);
            int rows = 0;
            if(productSnList.size() ==0){
                entity.setCreateBy(optName);
                rows = jtProductSnService.insertJtProductSn(entity);
            } else {
                if(productSnList.size() == 1){
                    if(isUpdateSupport ) {
                        entity.setSnId(productSnList.get(0).getSnId());
                        entity.setUpdateBy(optName);
                        rows = jtProductSnService.insertJtProductSn(entity);
                    } else {
                        failureNum++;
                        failureMsg.append("<br/>").append(i).append("、[").append(entity.getProductSn()).append("] 已存在，不支持更新！如需覆盖请勾选【覆盖】。");
                        continue;
                    }
                } else {
                    failureNum++;
                    failureMsg.append("<br/>").append(i).append("、[").append(entity.getProductSn()).append("] 查询到多条记录。");
                    continue;
                }
            }
            if(rows > 0) {
                successNum++;
                successMsg.append("<br/>").append(i).append("、").append(" [").append(entity.getProductSn()).append("] 成功");
            } else {
                failureNum++;
                failureMsg.append("<br/>").append(i).append("、").append("[").append(entity.getProductSn()).append("] 失败");
            }
        }
        if (failureNum > 0)
        {
            failureMsg.insert(0, "很抱歉，导入失败！共 " + failureNum + " 条数据格式不正确，错误如下：");
            throw new BaseException(failureMsg.toString());
        }
        else
        {
            successMsg.insert(0, "恭喜您，数据已全部导入成功！共 " + successNum + " 条，数据如下：");
        }
        return successMsg.toString();
    }
}
